package com.xuyiwei.xblog.business.article.service;

import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.xuyiwei.xblog.business.article.result.article.out.ArticleDto;
import com.xuyiwei.xblog.business.article.result.article.input.ArticleConditionVO;
import com.xuyiwei.xblog.business.article.model.Article;
import org.springframework.web.multipart.MultipartFile;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 文章表 服务类
 * </p>
 *
 * @author xuyiwei
 * @since 2018-10-22
 */
public interface IArticleService extends IService<Article> {

    List<String> listMaterial();

    /**
     * 发布文章
     * @param article
     * @param tags
     * @param file
     * @throws Exception
     */
    void publish(Article article, Long[] tags, MultipartFile file) throws Exception;


    /**
     * 根据文章的id去获得文章
     * @param articleId
     * @return
     */
    ArticleDto selectArticleById(Long articleId);

    /**
     * 文章置顶
     * @param top
     * @param ids
     */
    void top(boolean top,List<Long> ids);

    /**
     * 文章推荐
     * @param recommend
     * @param ids
     */
    void recommend(boolean recommend,List<Long> ids);

    /**
     * 发布文章
     * @param ids
     */
    void punishArticle(List<Long> ids);


    List<ArticleDto> findPageByCondition(Page page, ArticleConditionVO vo,String orderByField,boolean isAsc);


    /**
     * 站长推荐
     *
     * @param pageSize
     * @return
     */
    List<ArticleDto> listRecommended(int pageSize);

    /**
     * 近期文章
     *
     * @param pageSize
     * @return
     */
    List<ArticleDto> listRecent(int pageSize);

    /**
     * 随机文章
     *
     * @param pageSize
     * @return
     */
    List<ArticleDto> listRandom(int pageSize);

    /**
     * 获取热门文章
     *
     * @return
     */
    List<ArticleDto> listHotArticle(int pageSize);

    /**
     * 根据某篇文章获取与该文章相关的文章
     *
     * @return
     */
    List<ArticleDto> listRelatedArticle(int pageSize, ArticleDto dto);

    /**
     * 获取上一篇和下一篇
     *
     * @param insertTime
     * @return
     */
    Map<String, ArticleDto> getPrevAndNextArticles(Date insertTime) ;

    /**
     * 文章点赞
     *
     * @param id
     */
    void doPraise(Long id);

    /**
     * 是否存在文章
     *
     * @param id
     * @return
     */
    boolean isExist(Long id);

    /**
     * 文章踩
     *
     * @param id
     */
    void doOppose(Long id);

}
